[小ネタ] AWS CLI の結果を読み取り専用の変数に代入しつつ、リターンコードも取得する方法
はじめに
アノテーションの荒川です。7 月から AWS 構築業務を担当しています。
AWS CLI を使ったオペレーションを Bash のシェルスクリプトにする機会があり、コマンドのリターンコードによって処理を分岐させようと考えました。
リターンコードを使った分岐処理は、AWS ドキュメントを参考に作りました。
いざ実行してみるとreadonly
やlocal -r
を付けた変数に格納したときだけ、期待する動作となりませんでした。
問題のあるコード
以下のようなコードで、問題が発生しました。
readonly PARAM_VALUE=`aws ssm get-parameter \ --region ${REGION} \ --output text \ --name ${PARAM_KEY} \ --query "Parameter.Value" \ 2> /dev/null` if [ $? -eq 0 ]; then # パラメータの取得に成功 echo "Parameter Key: ${PARAM_KEY}" echo "Parameter Value: ${PARAM_VALUE}" else # パラメータの取得に失敗 echo "Failed to get Parameter Key: ${PARAM_KEY} in ${REGION}." fi
この場合、リターンコードの$?
は常に 0(成功)となり、パラメータの取得が成功した処理へと進みます。readonly
を消せば期待通りに動作しますが、SSM パラメータストアから取得した値は変更できなくしたいです。
期待する動作となるコード
以下のようなコードに修正することで、問題が回避できます。
readonly PARAM_VALUE=`aws ssm get-parameter \ --region ${REGION} \ --output text \ --name ${PARAM_KEY} \ --query "Parameter.Value" \ 2> /dev/null` return_code=$? if [ ${return_code} -eq 0 ]; then echo "Parameter Key: ${PARAM_KEY}" echo "Parameter Value: ${PARAM_VALUE}" # 分岐条件を追加してリターンコードに応じた処理が可能 else echo "Failed to get Parameter Key: ${PARAM_KEY} in ${REGION}." fi
PARAM_VALUE
だけではなくreturn_code
も readonly(再代入不可)となりますが、期待したリターンコードが得られます。
readonly
コマンドをリターンコード取得後に実行することでも、期待する動作となります。
PARAM_VALUE=`aws ssm get-parameter \ --region ${REGION} \ --output text \ --name ${PARAM_KEY} \ --query "Parameter.Value" \ 2> /dev/null` return_code=$? readonly PARAM_VALUE if [ ${return_code} -eq 0 ]; then echo "Parameter Key: ${PARAM_KEY}" echo "Parameter Value: ${PARAM_VALUE}" # 分岐条件を追加してリターンコードに応じた処理が可能 else echo "Failed to get Parameter Key: ${PARAM_KEY} in ${REGION}." fi
おわりに
問題の原因は Bash のreadonly
を他言語のアクセス修飾子のような感覚で使っていたためでした。
readonly
やlocal -r
はコマンドですので、実行に成功すればリターンコード 0(成功)が返され、直前に実行された AWS CLI のリターンコードが上書きされます。
問題の一時しのぎとして、パラメータストアから取得した文字列長が 0 かチェックする方法もありますが、リターンコードに応じた分岐処理が行えなくなるため、オススメできません。
同じような事象に遭遇した方の参考になれば幸いです。
参考
- AWS CLI からのリターンコードを理解する - AWS Command Line Interface
- 'readonly' exit status in bash - Stack Overflow
アノテーション株式会社について
アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、さまざまな背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。